package base.net.socket.packet
{
	import base.net.socket.SocketConfig;
	import base.types.SocketDataStructureType;
	
	/**
	 * 数据发送包 
	 * @author Devin
	 * 
	 */	
	public class SocketSendablePacket extends SocketPacketBase
	{
		/**
		 * 数据包头长度
		 */
		private var _packetHeadLength:int=0;
		
		/**
		 * 数据包尾长度
		 */
		private var _packetEndLength:int=0;
		
		/**
		 * 数据发送包 
		 * @param packetCode 包协议编号
		 * @param socketDataStructureType 数据包结构标识类型
		 */
		public function SocketSendablePacket(packetCode:int, socketDataStructureType:int=SocketDataStructureType.DATA)
		{
			super(packetCode, socketDataStructureType);
			_packetHeadLength=SocketConfig.PACKET_STRUCTURE_TYPE_LENGTH;//包头容量＝已计算容量大小+Socket数据包结构标识类型长度
			switch(socketDataStructureType)
			{
				case SocketDataStructureType.DATA:
					_packetHeadLength+=SocketConfig.PACKET_NUMBER_LENGTH+SocketConfig.PACKET_BODY_LENGTH;//包头容量＝已计算容量大小+数据包序号长度+数据包体长度
					_packetEndLength=SocketConfig.PACKET_END_LENGTH;
					break;
				case SocketDataStructureType.HANDSHAKE_TCP_ACK:
					_packetHeadLength=_packetHeadLength+SocketConfig.PACKET_BODY_LENGTH;//包头容量＝已计算容量大小+数据包体长度
					break;
			}
			writeByte(socketDataStructureType);//写入Socket数据包结构标识类型
			switch(socketDataStructureType)
			{
				case SocketDataStructureType.DATA:
					writeInt(0);//写入数据包序号占位
					writeShort(0);//先写入一个包体长度占位，包体结束后会替换为包真实长度，此长度仅为包体长度，不包括包头及包尾部分
					writeShort(packetCode);//写入数据包协议号
					break;
				case SocketDataStructureType.HANDSHAKE_TCP_ACK:
					writeShort(0);//先写入一个包体长度占位，包体结束后会替换为包真实长度，此长度仅为包体长度，不包括包头及包尾部分
					break;
			}
		}
		
		/**
		 * 设置包编号，只有TCP包才需要设置
		 * @param packetNumber 包编号
		 */
		public function setPacketNumber(packetNumber:int):void
		{
			if(_socketDataStructureType==SocketDataStructureType.DATA)
			{
				position=1;
				writeInt(packetNumber);//设置包编号
				position=length;
			}
		}
		
		public function end():void
		{
			switch(_socketDataStructureType)
			{
				case SocketDataStructureType.DATA:
					position=5;
					writeShort(length-_packetHeadLength-_packetEndLength);//写入数包体长度
					break;
				case SocketDataStructureType.HANDSHAKE_TCP_ACK:
					position=1;
					writeShort(length-_packetHeadLength);//写入数包体长度
					break;
			}
			flip();
		}
		
		override public function dispose():void
		{
			super.dispose();
		}
	}
}